package com.atde._05_behavioral_design_patterns.template.improve;


/**
 * @BelongsProject: hsp_java_design_mode
 * @BelongsPackage: com.atde._05_behavioral_design_patterns.template.improve
 * @Author: Del
 * @CreateTime: 2025-06-25  14:21
 * @Description: 模版方法 --- 抽象类 --- 加入钩子方法
 * @Version: 1.0
 */
public abstract class SoyaMilk {

    // 模版方法，make，模版方法可以做成 final，不让子类去覆盖
    final void make() {
        select();
        if (customerWantCondiments()) {
            addCondiments();
        }
        soak();
        beat();
    }

    // 选材料
    void select() {
        System.out.println("第一步：选择好的新鲜黄豆");
    }

    // 添加不同的配料，抽象方法，由具体的子类实现
    abstract void addCondiments();


    // 浸泡
    void soak() {
        System.out.println("第三步：黄豆和配料开始浸泡，需要3小时");
    }

    // 筛选
    void beat() {
        System.out.println("第四步：黄豆和配料放到豆浆机去打碎");
    }

    // 钩子方法，决定是否需要添加配料
    boolean customerWantCondiments() {
        return true;
    }
}
